package ar.com.ctrln.view.dashboard.compras.compra;

import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Image;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.compras.compra.RegistrarCompra;
import ar.com.ctrln.persistence.model.compra.Compra;
import ar.com.ctrln.persistence.model.compra.DetalleCompra;
import ar.com.ctrln.persistence.model.compra.PedidoCompra;
import ar.com.ctrln.persistence.model.proveedor.Proveedor;
import ar.com.ctrln.view.render.compras.compra.DetalleCompraItemRender;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@SuppressWarnings("rawtypes")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarCompraController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private RegistrarCompra registrarCompra;

	private Compra compra;

	private DetalleCompra detalle;

	private double totalCompra;

	private Set<DetalleCompra> listaDetalles;

	private EventQueue listarInsumo = (EventQueue) EventQueues.lookup(
			"addInsumos", EventQueues.DESKTOP, true);

	@SuppressWarnings("unused")
	private EventQueue act = (EventQueue) EventQueues.lookup("nuevoProveedor",
			EventQueues.DESKTOP, true);

	@Wire
	private Window wRegistrarCompra;

	@Wire
	private Div btnRegistrarCompra;

	@Wire
	private Div divCantCuotas;

	@Wire
	private Combobox cboProoverdorInsumo;

	@Wire
	private Datebox dbFechaEstimada;

	@Wire
	private Listbox lbDetalles;

	@Wire
	private Image iAgregarInsumo;

	@Wire
	private Image iQuitarInsumo;

	@Wire
	private Combobox cboFormaPago;

	@Wire
	private Decimalbox decimalExtras;

	@Wire
	private Decimalbox decimalTotal;

	@Wire
	private Spinner spinCantCuotas;

	private Set<PedidoCompra> pedidos;

	private ListModelList<DetalleCompra> modelo;

	@SuppressWarnings({ "unchecked" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		listaDetalles = new LinkedHashSet<DetalleCompra>();
		lbDetalles.setItemRenderer(new DetalleCompraItemRender());

		modelo = new ListModelList<DetalleCompra>();

		cboProoverdorInsumo.setModel(new ListModelList<Proveedor>(
				registrarCompra.listaProveedores()));
		listarInsumo.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				detalle = (DetalleCompra) event.getData();
				if (listaDetalles.contains(detalle)) {
					for (DetalleCompra d : listaDetalles) {
						if (d.getInsumo().getNombre()
								.equals(detalle.getInsumo().getNombre())) {
							d.setCantidad(d.getCantidad()
									+ detalle.getCantidad());
							d.setPrecioLote(d.getPrecioLote()
									+ detalle.getPrecioLote());
						}
					}
				} else {
					listaDetalles.add(detalle);
				}
				lbDetalles.setModel(new ListModelList<DetalleCompra>(
						listaDetalles));

			}

		});

		pedidos = (Set<PedidoCompra>) Executions.getCurrent().getArg()
				.get("data");

		if (null != pedidos) {

			for (PedidoCompra p : pedidos) {
				detalle = new DetalleCompra();
				detalle.setCantidad(p.getCantidad());
				detalle.setInsumo(p.getInsumo());
				detalle.setPrecioLote(p.getInsumo().getPrecio()
						* p.getCantidad());
				listaDetalles.add(detalle);
			}
			modelo.addAll(listaDetalles);
			lbDetalles.setModel(modelo);
		}

	}

	@Listen("onClick = #btnRegistrarCompra")
	public void registrarCompra() {

		if (cboProoverdorInsumo.getText().equals("Seleccione ...")
				|| cboFormaPago.getText().equals("Seleccione ...")) {
			Clients.showNotification(
					"Antes debe completar los campos faltantes",
					Clients.NOTIFICATION_TYPE_INFO, btnRegistrarCompra,
					"before_center", 6000);

		} else {
			compra = new Compra();
			compra.setProveedor((Proveedor) cboProoverdorInsumo.getModel()
					.getElementAt(cboProoverdorInsumo.getSelectedIndex()));
			compra.setFechaAlta(new Date());
			compra.setFechaRecepTentativa(dbFechaEstimada.getValue());
			compra.setEstado(Compra.ESTADO_ENESPERA);
			compra.setEstadoPago(Compra.ESTADOPAGO_PENDIENTE);
			compra.setFormaPago(cboFormaPago.getValue());
			compra.setCostoExtra(decimalExtras.getValue().doubleValue());

			for (DetalleCompra det : listaDetalles) {
				totalCompra += det.getPrecioLote();
			}
			for (PedidoCompra p : pedidos) {
				p.setEstado(PedidoCompra.ESTADO_REALIZADO);
				registrarCompra.actualizarPedido(p);
			}
			totalCompra += decimalExtras.getValue().doubleValue();
			compra.setTotalCompra(totalCompra);

			if (compra.getFormaPago().equals(Compra.FORMAPAGO_TARJETA))
				compra.setCantCuotas(spinCantCuotas.getValue());
			compra.setDetalles(listaDetalles);
			registrarCompra.guardarCompra(compra);

			EventQueue<Event> eq = EventQueues.lookup("actualizarListaPedido",
					EventQueues.DESKTOP, false);
			eq.publish(new Event("onButtonClick", btnRegistrarCompra, null));
			
			wRegistrarCompra.onClose();

			Clients.showNotification("La Compra se registro con exito!",
					Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);

		}

	}

	@Listen("onClick = #iAgregarProveedor")
	public void registrarProveedor() {
		Executions.createComponents(
				"/zul/compras/proveedor/registrarProveedor.zul", null, null);
	}

	@Listen("onSelect = #cboFormaPago")
	public void mostrarCuotas() {
		if (cboFormaPago.getText().equals(Compra.FORMAPAGO_TARJETA)) {
			divCantCuotas.setVisible(true);
		} else {
			divCantCuotas.setVisible(false);
		}
	}

	@Listen("onClick = #iAgregarInsumo")
	public void agregarInsumo() {

		Executions.createComponents(
				"/zul/compras/compras/registrarDetalleCompra.zul",
				wRegistrarCompra, null);
	}

	@Listen("onClick = #iQuitarInsumo")
	public void quitarInsumo() {

		listaDetalles.remove(lbDetalles.getSelectedItem().getValue());
		lbDetalles.setModel(new ListModelList<DetalleCompra>(listaDetalles));
	}

	@Listen("onClick = #btnCalcular")
	public void calcularTotal() {

		for (DetalleCompra det : listaDetalles) {
			totalCompra += det.getPrecioLote();
		}
		totalCompra += decimalExtras.getValue().doubleValue();
		decimalTotal.setValue(BigDecimal.valueOf(totalCompra));
		totalCompra = 0;
	}

}
